<?php
/**
 * Controller_Profile
 *
 * Класс отвечает за обработку страниц, связанных с профайлом пользователя
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.1
 */
class Controller_Profile extends Controller_Base {

	protected $_arrMenu = array(); // Массив с данными о меню пользователя
	
	/**
	 * Конструктор контроллера
	 *
	 * @param array $arrRequest - массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	*/
	public function __construct(&$arrRequest) {
	  	Service_Debug::setDebug();
	  	parent::__construct($arrRequest);
		//$this->showRightColumn = false;
		//$this->addCrumb(Service_Translate::getText('Главная'), W_ABSPATH);
		//$this->addCrumb(Service_Translate::getText('Профайл'), W_ABSPATH . 'profile/');
		//$this->_arrMenu = $this->getProfileMenuArray($this->arrRequest[1]);
	} 
	
	/**
	 * Выбор действия по URL
	 */
	public function action() {
		Service_Debug::setDebug();
		// Создаем объект пользователя и проверяем что пользователь вошел
		$objUser = User_User::getUser();
		if(!$objUser->id) User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH), Service_Translate::getText('Страница профайла доступна только зарегистрированным пользователям'));
		else $this->_arrMenu = $this->getProfileMenuArray($this->arrRequest[1]);
		switch ($this->arrRequest[1]) {
			case '':
				$this->actionEditProfile($objUser);
				break;
			case 'orders': // Заказы
				if($this->arrRequest[2] != '') { // Страница конкретного заказа
					$objOrder= new Order($this->arrRequest[2]);
					if(!$objOrder->id) throw new Exception_SiteError('', 404);
					elseif(SimpleAdministration::isAuthor($objOrder->getField('ID_user')) || $objOrder->getField('ID_driver') && $objOrder->getField('ID_driver') == User_User::isDriver()) {
						$controller = new Controller_Order($this->arrRequest);
						$controller->actionOne($objOrder);
					} 
					else throw new Exception_SiteError('', 403);	// Пользователь не автор этого заказа и не водитель заказа
				}
				else {
					$ordersType = isset($_GET['opt']) ? $_GET['opt'] : null;
					if($ordersType == 'wait') $this->actionOrders($objUser, 'wait');
					else if($ordersType == 'complite') $this->actionOrders($objUser, 'complite');
					else if($ordersType == 'execute') $this->actionOrders($objUser, 'execute');
					else $this->actionOrders($objUser, 'all');
				}
				break;
			case 'money': // Прибыль/Расходы
				$this->actionMoney($objUser);
				break;
			default: throw new Exception_SiteError('', 404);
		}
	}
 
	/**
	 * Выбор действия над заказом
	 * 
	 * @param User_User $objUser - Пользователь
	 * @param Booking $objBooking - Бронирование
	 */
	public function actionBooking(User_User $objUser, Booking $objBooking) {
		Service_Debug::setDebug();
		if ($objBooking->getField('is_our')) {
			$objHotel = new OurHotel($objBooking->getField('ID_hotel'));
		}
		else {
		  $objHotel = new Hotel($objBooking->getField('ID_hotel'), array(
		  	'select' => "hotel.*, hotel_description.hotel_description_en AS booking_hotel_description_en, hotel_description.hotel_description_ru AS booking_hotel_description_ru, hotel_photo.url_square_60, hotel_photo.url_max_300 ",
		  	'joins' => "LEFT JOIN hotel_description ON hotel.ID_hotel = hotel_description.ID_hotel
		  	LEFT JOIN (
			  	SELECT hotel_photo.url_max_300, hotel_photo.url_square_60, ID_photo, ID_hotel
					FROM hotel_photo
			    WHERE hotel_photo.ID_hotel = " . $objBooking->getField('ID_hotel') . "
					ORDER BY hotel_photo.ID_photo DESC
			  ) AS hotel_photo ON (hotel.ID_hotel = hotel_photo.ID_hotel) ",
		  ));
		}	 
		switch ($this->arrRequest[3]) {
			case 'change':
				$this->addCrumb(Service_Translate::getText('Изменение бронирования'), W_ABSPATH . 'profile/orders/' . $objBooking->id . '/change/');
				switch ($this->arrRequest[4]) {
					case '':
						$this->actionChangeOrder($objUser, $objBooking, $objHotel);
						break;
					case 'dates':
						$this->actionChangeOrderDates($objUser, $objBooking, $objHotel);
						break;
					case 'card':
						if ($objBooking->getField('payment_type') != 'Credit card') throw new Exception_SiteError('', 404);
						$this->actionChangeOrderCard($objUser, $objBooking, $objHotel);
						break;
					case 'other':
						$this->actionChangeOrderOther($objUser, $objBooking, $objHotel);
						break;
					default: throw new Exception_SiteError('', 404);
				}
				break;
			default: throw new Exception_SiteError('', 404);
		}		
	}
	
	/**
	 * Страница редактирования профайла
	 * 
	 * @param User_User $objUser - Пользователь
	 */
	public function actionEditProfile(User_User $objUser) {
		Service_Debug::setDebug();

	  	// Обработка формы
		if (isset($_POST['User_User'])) {
			$editId = $objUser->id;
			$objUserForm = new User_User($_POST['User_User']);
			if ($objUserForm->id != $editId) User_Session::moveTo(W_ABSPATH . 'profile/', 'Недопустимое действие');
			if ($objUserForm->save()) {
				User_Session::moveTo(W_ABSPATH . 'profile/','Профайл успешно сохранен', 1);
			}
		}
		
		$this->showLeftColumn = true;
		$this->bodyAttrs = 'class="edit-profile _profile"';
		$this->title = 'Редактирование профиля';
	  	$objViewProfile = new View_Profile();
	  
	  	$this->showHeader();
	    	$objViewProfile->showProfileEditForm($objUser);
		$this->showFooter();
	}
		
	/**
	 * Страница расходов/прибыли
	 * 
	 * @param User_User $objUser - объект пользователя
	 */
	public function actionMoney(User_User $objUser) {
		Service_Debug::setDebug();
		
		$idDriver = User_User::isDriver();
		$ordersArray = Order::getMoneyData($idDriver);

		$this->showLeftColumn = true;
		$this->bodyAttrs = 'class="money-stat"';
		$this->title = $idDriver ? 'Прибыль' : 'Расходы';
		$objViewProfile = new View_Profile();
		$this->showHeader();
			$objViewProfile->showMoneyPage($objUser, $idDriver, $ordersArray);
		$this->showFooter();
	}
	
	/**
	 * Страница со списком заказов пользователя
	 * 
	 * @param User_User $objUser - Пользователь
	 * @param string $ordersType - тип заказов для показа(все, выполняемые, ожидаемые, выполненные)
	 */
	public function actionOrders(User_User $objUser, $ordersType) {
		Service_Debug::setDebug();
		$objOrder = new Order();
	  	
		switch($ordersType) {
			case 'wait':
				$condition = '`order`.`loaded` = 0 AND `order`.`canceled` = 0';
				break;
			case 'execute':
				$condition = '`order`.`loaded` = 1 AND `order`.`unloaded`= 0 AND `order`.`canceled` = 0';
				break;
			case 'complite':
				$condition = '`order`.`loaded` = 1 AND `order`.`unloaded` = 1';
				break;
			default:
				$condition = '';
				break;
				
		}
	
	 	if($idDriver = User_User::isDriver()){ // Если водитель - получаем заказы для водителя
	  		$ordersArray = $objOrder->find('all', array('select' => '`order`.`ID_order`,`order`.`ID_driver`,`order`.`ID_user`,`order`.`description`,`order`.`created_at`,`c_from`.`city_name` AS `from`,`c_to`.`city_name` AS `to`','joins' => 'INNER JOIN `city` `c_from` ON (`c_from`.`ID_city`=`order`.`city_from`) INNER JOIN `city` `c_to` ON (`c_to`.`ID_city`=`order`.`city_to`)', 'conditions' => "`order`.`ID_driver`='". $idDriver . "'" . ( $condition != '' ? " AND " . $condition : null), 'order' => '`order`.`created_at` DESC'));
		}
	  	else { // Иначе ищем заказы закзчика
	  		$ordersArray = $objOrder->find('all',array('select' => '`order`.`ID_order`,`order`.`ID_driver`,`order`.`ID_user`,`order`.`description`,`order`.`created_at`,`c_from`.`city_name` AS `from`,`c_to`.`city_name` AS `to`','joins' => 'INNER JOIN `city` `c_from` ON (`c_from`.`ID_city`=`order`.`city_from`) INNER JOIN `city` `c_to` ON (`c_to`.`ID_city`=`order`.`city_to`)', 'conditions' => "`order`.`ID_user`='". User_User::getId() . "'" . ( $condition != '' ? " AND " . $condition : null), 'order' => '`order`.`created_at` DESC'));
	  	}
	  	
	  	
	  	$this->showLeftColumn = true;
	  	$this->title = 'Заказы';
		$this->pageHead = '';
		
	  
	  	$objViewProfile = new View_Profile();
	  
	  	$this->showHeader();
	   		$objViewProfile->showOrdersList($ordersArray, $ordersType);
		$this->showFooter();
	}
	
	/**
	 * Страница настроек пользователя
	 * 
	 * @param User_User $objUser - Пользователь
	 */
	public function actionSettings(User_User $objUser) {
	  Service_Debug::setDebug();
	  // Обработка формы
		if (isset($_POST['User_User'])) {
			$objUserForm = new User_User($_POST['User_User']);
			$arrData = Service_Escape::requestDataArray('User_User');
	    $objAuth = new User_Auth();
	    if ($objAuth->changePassword($arrData['pass'], $arrData['new_pass'], $arrData['new_pass_confirmation'])) {
	    	User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH) . 'profile/', Service_Translate::getText('Пароль успешно сохранен'), 1);
	    }
		}
		else $objUserForm = new User_User();
		
	  $this->pageHead = false;
		$this->title = Service_Translate::getText('Настройки');
		$this->addCrumb($this->title, W_ABSPATH . 'profile/settings/');
		
		$objViewProfile = new View_Profile();
	  
	  $this->showHeader();
	    $objViewProfile->showProfileMenu($objUser, $this->_arrMenu);
	    $objViewProfile->changePasswordForm($objUserForm);
		$this->showFooter();
	}

	/**
	 * Страница редактирования заказа 
	 * 
	 * @param User_User $objUser - Пользователь
	 * @param Booking $objBooking - Объект бронирования
	 * @param Hotel $objHotel - Объект отеля
	 */
	public function actionChangeOrder(User_User $objUser, Booking $objBooking, BaseHotel $objHotel) {
		Service_Debug::setDebug();
		
		$arrHotelNames = $objHotel->getNames();
				
	  $this->title = Service_Translate::getText('Изменение бронирования');
	  
	  $objViewBlock = new View_Block();
	  $objViewProfile = new View_Profile();		
		
	  $this->showHeader();
	    $objViewProfile->showProfileMenu($objUser, $this->_arrMenu);
	    $objViewBlock->showProfileBookingInfo($objUser, $objBooking, $objHotel, $arrHotelNames);
	    $objViewProfile->showChangeOrder($objBooking);
		$this->showFooter();		
	}

	/**
	 * Страница редактирования дат заказа 
	 * 
	 * @param User_User $objUser - Объект пользователя
	 * @param Booking $objBooking - Объект бронирования
	 * @param BaseHotel $objHotel - Объект отеля
	 */
	public function actionChangeOrderDates(User_User $objUser, Booking $objBooking, BaseHotel $objHotel) {
		Service_Debug::setDebug();
		// Обработка формы
		if (isset($_POST['BookingChange'])) {
			$objBookingChange = new BookingChange($_POST['BookingChange']);
			$objBookingChange->setFields(array('change_type' => 'dates', 'ID_booking' => $objBooking->id));
			if ($objBookingChange->save()) {
				$objNotification = new User_Notification();
				$objNotification->changeRequest($objBookingChange, $objBooking);
				User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH . 'profile/orders/' . $objBooking->id . '/change/'), Service_Translate::getText('Запрос на изменение отправлен'));
			}
		}
		else $objBookingChange = new BookingChange();		
		
		$dateArr = Service_Date::dateBDToHuman($objBooking->getField('date_arr'));
	  $dateDep = Service_Date::dateBDToHuman($objBooking->getField('date_dep'));
		$arrNames = $objHotel->getNames();
		
		$this->addJsReadyForCalendar($dateArr, $dateDep);
		
	  $this->title = Service_Translate::getText('Изменение бронирования');	 
	  $this->bodyActionName = 'change-order-dates'; 
	  
	  $objViewBlock = new View_Block();
	  $objViewProfile = new View_Profile();		
		
	  $this->showHeader();
	    $objViewProfile->showProfileMenu($objUser, $this->_arrMenu);
	    $objViewBlock->showProfileBookingInfo($objUser, $objBooking, $objHotel, $arrNames);
	    $objViewProfile->showChangeOrderDates($objBookingChange, $dateArr, $dateDep);
		$this->showFooter();		
	}

	/**
	 * Страница редактирования кредитной карты заказа 
	 * 
	 * @param User_User $objUser - Объект пользователя
	 * @param Booking $objBooking - Объект бронирования
	 * @param Hotel $objHotel - Объект отеля
	 */
	public function actionChangeOrderCard(User_User $objUser, Booking $objBooking, BaseHotel $objHotel) {
		Service_Debug::setDebug();
		// Обработка формы
		if (isset($_POST['BookingChange'])) {
			$objBookingChange = new BookingChange($_POST['BookingChange']);
			$objBookingChange->setFields(array('change_type' => 'card', 'ID_booking' => $objBooking->id));
			if ($objBookingChange->save()) {
				$objNotification = new User_Notification();
				$objNotification->changeRequest($objBookingChange, $objBooking);
				User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH . 'profile/orders/' . $objBooking->id . '/change/'), Service_Translate::getText('Запрос на изменение отправлен'));
			}
		}
		else $objBookingChange = new BookingChange();
		
		$arrNames = $objHotel->getNames();
		$objCreditCard = new HotelCreditCard();
		$arrCreditCards = $objCreditCard->getHotelCreditCards($objHotel->id, true);	  	
		
	  $this->title = Service_Translate::getText('Изменение бронирования');
	  $this->bodyActionName = 'change-order-card';
	  
	  $objViewBlock = new View_Block();
	  $objViewProfile = new View_Profile();	  		
		
	  $this->showHeader();
	    $objViewProfile->showProfileMenu($objUser, $this->_arrMenu);
	    $objViewBlock->showProfileBookingInfo($objUser, $objBooking, $objHotel, $arrNames);
	    $objViewProfile->showChangeOrderCard($objBookingChange, $arrCreditCards);
		$this->showFooter();		
	}

	/**
	 * Страница запроса на редактирование других данных заказа 
	 * 
	 * @param User_User $objUser - Объект пользователя
	 * @param Booking $objBooking - Объект бронирования
	 * @param Hotel $objHotel - Объект отеля
	 */
	public function actionChangeOrderOther(User_User $objUser, Booking $objBooking, BaseHotel $objHotel) {
		Service_Debug::setDebug();
		// Обработка формы
		if (isset($_POST['BookingChange'])) {
			$objBookingChange = new BookingChange($_POST['BookingChange']);
			$objBookingChange->setFields(array('change_type' => 'other', 'ID_booking' => $objBooking->id));
			if ($objBookingChange->save()) {
				$objNotification = new User_Notification();
				$objNotification->changeRequest($objBookingChange, $objBooking);
				User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH . 'profile/orders/' . $objBooking->id . '/change/'), Service_Translate::getText('Запрос на изменение отправлен'));
			}
		}
		else $objBookingChange = new BookingChange();		
		
		$arrNames = $objHotel->getNames();	
		
	  $this->title = Service_Translate::getText('Изменение бронирования');
	  $this->bodyActionName = 'change-order-other';
	  
	  $objViewBlock = new View_Block();
	  $objViewProfile = new View_Profile();		
		
	  $this->showHeader();
	    $objViewProfile->showProfileMenu($objUser, $this->_arrMenu);
	    $objViewBlock->showProfileBookingInfo($objUser, $objBooking, $objHotel, $arrNames);
	    $objViewProfile->showChangeOrderOther($objBookingChange);
		$this->showFooter();		
	}
	
	/**
	 * Возвращаем массив данных меню профиля для вывода 
	 * 
	 * @param string $url - URL страницы на которой мы находимся
	 */
	public function getProfileMenuArray($url = '') {
		Service_Debug::setDebug();
		$arrMenu[0]['name'] = 'Профайл';
		$arrMenu[0]['url'] = '';
		$arrMenu[0]['imageClass'] = 'prof';
		$arrMenu[1]['name'] = 'Заказы';
		$arrMenu[1]['url'] = 'orders';
		$arrMenu[1]['imageClass'] = 'orders';
		$arrMenu[2]['name'] = User_User::isDriver() ? 'Прибыль' : 'Расходы';
		$arrMenu[2]['url'] = 'money';
		$arrMenu[2]['imageClass'] = 'rashod';
		//$arrMenu[2]['name'] = Service_Translate::getText('Настройки');
		//$arrMenu[2]['url'] = 'settings';
		foreach ($arrMenu as $key => $arrLink) {
			if ($url == $arrLink['url']) $arrMenu[$key]['is_selected'] = 1;
		}
		return $arrMenu;
	}
	
	public function showLeft() {
		$objUser = User_User::getUser();
		echo '<div id="left">';
			echo '<div class="leftMenu">';
				echo '<div class="name">';
					echo $objUser->getField('last_name') . ' ' . $objUser->getField('first_name');
				echo '</div>';
					echo '<nav><ul id="profileMenu">';
						foreach ($this->_arrMenu as $arrLink) {
							echo '<li' . ((!empty($arrLink['is_selected'])) ? ' class="selected"' : null) . '>';
								echo '<a href="' . W_ABSPATH . 'profile/' . $arrLink['url'] . '">';
									echo '<div class="menu-icon ' . $arrLink['imageClass'] . '"></div>';
									echo '<div class="menu-item-nm">' . $arrLink['name'] . '</div>';
								echo '</a>';
							echo '</li>';
						}
					echo '</ul></nav>';
			echo '</div>';
		echo '</div>';
	}
	
}
?>